<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<!-- <ul>
		<li>主页</li>
		<li>详情</li>
	</ul> -->
	<script>
		// 闭包作用 :1 保存索引
		// var oLi = document.getElementsByTagName('li');
		// for(var i=0;i<oLi.length;i++){
		// 	 (function(z){
		// 	 	oLi[z].onclick =function(){
		// 		console.log(z)

		// 		}
		// 	})(i)
		// }
		// 2 私有变量计数器,外部无法访问,避免全局变量的污染
		// window.onload = function(){
		// 	// 封闭函数
		// 	var count = (function(){
		// 		var a =0;
		// 		// 闭包(函数嵌套函数)
		// 		function b(){
		// 			a++;
		// 			return a;
		// 		}
		// 		return b;
		// 	})()
		// 	count();
		// 	console.log(count());
		// 	console.log(count());
		// 	console.log(count());





		// }
		// var a = 10;
		// var count2 = (function (){
		// 	// 这不是一个闭包,闭包必须函数套函数
		// 	var a = 1;
		// 	function c(){
		// 		a++;
		// 		return a;
		// 	}
		// 	return c;
			
		// 	})()
		// 	count2();
		// 	console.log(count2());

			// 循环中的闭包
			// for(var i = 0; i < 10; i++) {
			// 	 // console.log 被调用的时候，匿名函数保持对外部变量 i 的引用,，此时 for循环已经结束， i 的值被修改成了 10
			//     setTimeout(function() {
			//     	// var m = i;
			//     	// 利用变量的拷贝机制,才不是歹意10次 10
			//         console.log(i);  
			//     }, 1000);
			// }
			// 需修改为
			// 外部的匿名函数会立即执行，并把 i 作为它的参数，此时函数内 e 变量就拥有了 i 的一个拷贝。

			// 当传递给 setTimeout 的匿名函数执行时，它就拥有了对 e 的引用，而这个值是不会被循环改变的。

			// 有另一个方法完成同样的工作，那就是从匿名包装器中返回一个函数。这和上面的代码效果一样。
			// for(var i = 0; i < 10; i++) {
			//     // setTimeout((function() {
			//     // 	// var m = i;
			//     // 	// 利用变量的拷贝机制,才不是歹意10次 10
			//     //     console.log(i);  
			//     // })(), 1000);

			//     (function(i){
			//     	setTimeout(function(){
			//     		console.log(i);
			//     	},1000)
			//     })(i)
			// }

			// var foo = {name: 'kitten'}
			// foo.name; // kitten
			// foo['name']; // kitten

			// var get = 'name';
			// foo[get]; // kitten

			// // foo.1234; // SyntaxError 报错
			// foo['1234']; // work 不会报错

			// 阐述在 ES5 的严格模式下 `arguments` 的特性
			function f(a) {
			  "use strict";
			  a = 42;
			  return [a, arguments[0]];
			  // [42,17]
			}
			var pair = f(17);
			console.log(pair[0] === 42);
			console.log(pair[1] === 17);
			
	</script>
</body>
</html>